| 1 | /** | 
|---|
| 2 | * \File     : reset_hba.h | 
|---|
| 3 | * \Date     : 01/04/2015 | 
|---|
| 4 | * \Author   : alain greiner | 
|---|
| 5 | * \Copyright (c) UPMC-LIP6 | 
|---|
| 6 | */ | 
|---|
| 7 |  | 
|---|
| 8 | #ifndef _RESET_HBA_H | 
|---|
| 9 | #define _RESET_HBA_H | 
|---|
| 10 |  | 
|---|
| 11 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 12 | // HBA component registers offsets | 
|---|
| 13 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 14 |  | 
|---|
| 15 | enum SoclibMultiAhciRegisters | 
|---|
| 16 | { | 
|---|
| 17 | HBA_PXCLB            = 0,         // command list base address 32 LSB bits | 
|---|
| 18 | HBA_PXCLBU           = 1,         // command list base address 32 MSB bits | 
|---|
| 19 | HBA_PXIS             = 4,         // interrupt status | 
|---|
| 20 | HBA_PXIE             = 5,         // interrupt enable | 
|---|
| 21 | HBA_PXCMD            = 6,         // run | 
|---|
| 22 | HBA_PXCI             = 14,        // command bit-vector | 
|---|
| 23 | HBA_SPAN             = 0x400,     // 4 Kbytes per channel => 1024 slots | 
|---|
| 24 | }; | 
|---|
| 25 |  | 
|---|
| 26 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 27 | // structures for one AHCI command table | 
|---|
| 28 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 29 |  | 
|---|
| 30 | typedef struct hba_cmd_header_s // size = 16 bytes | 
|---|
| 31 | { | 
|---|
| 32 | // WORD 0 | 
|---|
| 33 | unsigned int        res0;       // reserved | 
|---|
| 34 |  | 
|---|
| 35 | // WORD 1 | 
|---|
| 36 | unsigned char           lba0;           // LBA 7:0 | 
|---|
| 37 | unsigned char           lba1;           // LBA 15:8 | 
|---|
| 38 | unsigned char           lba2;           // LBA 23:16 | 
|---|
| 39 | unsigned char           res1;           // reserved | 
|---|
| 40 |  | 
|---|
| 41 | // WORD 2 | 
|---|
| 42 | unsigned char           lba3;           // LBA 31:24 | 
|---|
| 43 | unsigned char           lba4;           // LBA 39:32 | 
|---|
| 44 | unsigned char           lba5;           // LBA 47:40 | 
|---|
| 45 | unsigned char           res2;           // reserved | 
|---|
| 46 |  | 
|---|
| 47 | // WORD 3 to 31 | 
|---|
| 48 | unsigned int        res3;       // reserved | 
|---|
| 49 |  | 
|---|
| 50 | } hba_cmd_header_t; | 
|---|
| 51 |  | 
|---|
| 52 | typedef struct hba_cmd_buffer_s // size = 16 bytes | 
|---|
| 53 | { | 
|---|
| 54 | unsigned int        dba;        // Buffer base address 32 LSB bits | 
|---|
| 55 | unsigned int        dbau;       // Buffer base address 32 MSB bits | 
|---|
| 56 | unsigned int        res0;       // reserved | 
|---|
| 57 | unsigned int        dbc;        // Buffer byte count | 
|---|
| 58 |  | 
|---|
| 59 | } hba_cmd_buffer_t; | 
|---|
| 60 |  | 
|---|
| 61 | typedef struct hba_cmd_table_s  // one command = header + one buffer | 
|---|
| 62 | { | 
|---|
| 63 |  | 
|---|
| 64 | hba_cmd_header_t   header;      // contains lba value | 
|---|
| 65 | hba_cmd_buffer_t   buffer;      // contains buffer address & size | 
|---|
| 66 |  | 
|---|
| 67 | } hba_cmd_table_t; | 
|---|
| 68 |  | 
|---|
| 69 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 70 | // structure for one AHCI command descriptor | 
|---|
| 71 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 72 |  | 
|---|
| 73 | typedef struct hba_cmd_desc_s  // size = 16 bytes | 
|---|
| 74 | { | 
|---|
| 75 | // WORD 0 | 
|---|
| 76 | unsigned char       flag[2];    // W in bit 6 of flag[0] | 
|---|
| 77 | unsigned char       prdtl[2];       // Number of buffers | 
|---|
| 78 |  | 
|---|
| 79 | // WORD 1 | 
|---|
| 80 | unsigned int        prdbc;          // Number of bytes actually transfered | 
|---|
| 81 |  | 
|---|
| 82 | // WORD 2, WORD 3 | 
|---|
| 83 | unsigned int        ctba;           // Command data base address 32 LSB bits | 
|---|
| 84 | unsigned int        ctbau;          // Command data base address 32 MSB bits | 
|---|
| 85 |  | 
|---|
| 86 | } hba_cmd_desc_t; | 
|---|
| 87 |  | 
|---|
| 88 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 89 | //              access functions | 
|---|
| 90 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 91 |  | 
|---|
| 92 | int reset_hba_init (); | 
|---|
| 93 |  | 
|---|
| 94 | int reset_hba_read( unsigned int lba, | 
|---|
| 95 | void*        buffer, | 
|---|
| 96 | unsigned int count ); | 
|---|
| 97 | #endif | 
|---|
| 98 |  | 
|---|
| 99 | // Local Variables: | 
|---|
| 100 | // tab-width: 4 | 
|---|
| 101 | // c-basic-offset: 4 | 
|---|
| 102 | // c-file-offsets:((innamespace . 0)(inline-open . 0)) | 
|---|
| 103 | // indent-tabs-mode: nil | 
|---|
| 104 | // End: | 
|---|
| 105 | // vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4 | 
|---|
| 106 |  | 
|---|