Home | History | Annotate | Line # | Download | only in pcmcia
pcmciavar.h revision 1.1.2.2
      1  1.1.2.1  marc #include <sys/types.h>
      2  1.1.2.1  marc #include <sys/queue.h>
      3  1.1.2.1  marc 
      4  1.1.2.1  marc #include <machine/bus.h>
      5  1.1.2.1  marc 
      6  1.1.2.1  marc #include <dev/pcmcia/pcmciachip.h>
      7  1.1.2.1  marc 
      8  1.1.2.1  marc /* pcmcia itself */
      9  1.1.2.1  marc 
     10  1.1.2.1  marc #define PCMCIA_CFE_MWAIT_REQUIRED	0x0001
     11  1.1.2.1  marc #define PCMCIA_CFE_RDYBSY_ACTIVE	0x0002
     12  1.1.2.1  marc #define PCMCIA_CFE_WP_ACTIVE		0x0004
     13  1.1.2.1  marc #define PCMCIA_CFE_BVD_ACTIVE		0x0008
     14  1.1.2.1  marc #define PCMCIA_CFE_IO8			0x0010
     15  1.1.2.1  marc #define PCMCIA_CFE_IO16			0x0020
     16  1.1.2.1  marc #define PCMCIA_CFE_IRQSHARE		0x0040
     17  1.1.2.1  marc #define PCMCIA_CFE_IRQPULSE		0x0080
     18  1.1.2.1  marc #define PCMCIA_CFE_IRQLEVEL		0x0100
     19  1.1.2.1  marc #define PCMCIA_CFE_POWERDOWN		0x0200
     20  1.1.2.1  marc #define PCMCIA_CFE_READONLY		0x0400
     21  1.1.2.1  marc #define PCMCIA_CFE_AUDIO		0x0800
     22  1.1.2.1  marc 
     23  1.1.2.1  marc struct pcmcia_config_entry {
     24  1.1.2.1  marc     int number;
     25  1.1.2.1  marc     u_int32_t flags;
     26  1.1.2.1  marc     int iftype;
     27  1.1.2.1  marc     int num_iospace;
     28  1.1.2.1  marc     u_long iomask;	/* the card will only decode this mask in any case,
     29  1.1.2.1  marc 			   so we can do dynamic allocation with this in
     30  1.1.2.1  marc 			   mind, in case the suggestions below are no good */
     31  1.1.2.1  marc     struct {
     32  1.1.2.1  marc 	u_long length;
     33  1.1.2.1  marc 	u_long start;
     34  1.1.2.1  marc     } iospace[4];	/* XXX this could be as high as 16 */
     35  1.1.2.1  marc     u_int16_t irqmask;
     36  1.1.2.1  marc     int num_memspace;
     37  1.1.2.1  marc     struct {
     38  1.1.2.1  marc 	u_long length;
     39  1.1.2.1  marc 	u_long cardaddr;
     40  1.1.2.1  marc 	u_long hostaddr;
     41  1.1.2.1  marc     } memspace[2];	/* XXX this could be as high as 8 */
     42  1.1.2.1  marc     int maxtwins;
     43  1.1.2.1  marc     SIMPLEQ_ENTRY(pcmcia_config_entry) cfe_list;
     44  1.1.2.1  marc };
     45  1.1.2.1  marc 
     46  1.1.2.1  marc struct pcmcia_function {
     47  1.1.2.1  marc     /* read off the card */
     48  1.1.2.1  marc     int number;
     49  1.1.2.1  marc     int function;
     50  1.1.2.1  marc     int last_config_index;
     51  1.1.2.1  marc     u_long ccr_base;
     52  1.1.2.1  marc     u_long ccr_mask;
     53  1.1.2.1  marc     SIMPLEQ_HEAD(, pcmcia_config_entry) cfe_head;
     54  1.1.2.1  marc     SIMPLEQ_ENTRY(pcmcia_function) pf_list;
     55  1.1.2.1  marc     /* run-time state */
     56  1.1.2.1  marc     struct pcmcia_softc *sc;
     57  1.1.2.1  marc     struct pcmcia_config_entry *cfe;
     58  1.1.2.1  marc     bus_space_tag_t ccrt;
     59  1.1.2.1  marc     bus_space_handle_t ccrh;
     60  1.1.2.1  marc     u_long ccr_offset;
     61  1.1.2.1  marc     int ccr_window;
     62  1.1.2.1  marc     pcmcia_mem_handle_t ccr_mhandle;
     63  1.1.2.1  marc     u_long ccr_realsize;
     64  1.1.2.1  marc     int (*ih_fct) __P((void *));
     65  1.1.2.1  marc     void *ih_arg;
     66  1.1.2.1  marc     int ih_ipl;
     67  1.1.2.1  marc };
     68  1.1.2.1  marc 
     69  1.1.2.1  marc struct pcmcia_card {
     70  1.1.2.1  marc     int cis1_major, cis1_minor;
     71  1.1.2.1  marc     /* XXX waste of space? */
     72  1.1.2.1  marc     char cis1_info_buf[256];
     73  1.1.2.1  marc     char *cis1_info[4];
     74  1.1.2.1  marc     int manufacturer;
     75  1.1.2.1  marc     u_int16_t product;
     76  1.1.2.1  marc     u_int16_t error;
     77  1.1.2.1  marc     SIMPLEQ_HEAD(, pcmcia_function) pf_head;
     78  1.1.2.1  marc };
     79  1.1.2.1  marc 
     80  1.1.2.1  marc struct pcmcia_softc {
     81  1.1.2.1  marc     struct device dev;
     82  1.1.2.1  marc     /* this stuff is for the socket */
     83  1.1.2.1  marc     pcmcia_chipset_tag_t pct;
     84  1.1.2.1  marc     pcmcia_chipset_handle_t pch;
     85  1.1.2.1  marc     /* this stuff is for the card */
     86  1.1.2.1  marc     struct pcmcia_card card;
     87  1.1.2.1  marc     void *ih;
     88  1.1.2.1  marc };
     89  1.1.2.1  marc 
     90  1.1.2.1  marc struct pcmcia_attach_args {
     91  1.1.2.1  marc     u_int16_t manufacturer;
     92  1.1.2.1  marc     u_int16_t product;
     93  1.1.2.1  marc     struct pcmcia_card *card;
     94  1.1.2.1  marc     struct pcmcia_function *pf;
     95  1.1.2.1  marc };
     96  1.1.2.1  marc 
     97  1.1.2.1  marc struct pcmcia_tuple {
     98  1.1.2.1  marc     unsigned int code;
     99  1.1.2.1  marc     unsigned int length;
    100  1.1.2.1  marc     u_long mult;
    101  1.1.2.1  marc     u_long ptr;
    102  1.1.2.1  marc     bus_space_tag_t memt;
    103  1.1.2.1  marc     bus_space_handle_t memh;
    104  1.1.2.1  marc };
    105  1.1.2.1  marc 
    106  1.1.2.1  marc void pcmcia_read_cis __P((struct pcmcia_softc *));
    107  1.1.2.1  marc void pcmcia_print_cis __P((struct pcmcia_softc *));
    108  1.1.2.1  marc int pcmcia_scan_cis __P((struct device *dev,
    109  1.1.2.1  marc 			 int (*)(struct pcmcia_tuple *, void *), void *));
    110  1.1.2.1  marc 
    111  1.1.2.1  marc #define pcmcia_cis_read_1(tuple, idx0) \
    112  1.1.2.1  marc 	(bus_space_read_1((tuple)->memt, (tuple)->memh, \
    113  1.1.2.1  marc 			  (tuple)->mult*(idx0)))
    114  1.1.2.1  marc #define pcmcia_tuple_read_1(tuple, idx1) \
    115  1.1.2.1  marc 	(pcmcia_cis_read_1((tuple), ((tuple)->ptr+(2+(idx1)))))
    116  1.1.2.1  marc #define pcmcia_tuple_read_2(tuple, idx2) \
    117  1.1.2.1  marc 	(pcmcia_tuple_read_1((tuple), (idx2)) | \
    118  1.1.2.1  marc 	 (pcmcia_tuple_read_1((tuple), (idx2)+1)<<8))
    119  1.1.2.1  marc #define pcmcia_tuple_read_3(tuple, idx3) \
    120  1.1.2.1  marc 	(pcmcia_tuple_read_1((tuple), (idx3)) | \
    121  1.1.2.1  marc 	 (pcmcia_tuple_read_1((tuple), (idx3)+1)<<8) | \
    122  1.1.2.1  marc 	 (pcmcia_tuple_read_1((tuple), (idx3)+2)<<16))
    123  1.1.2.1  marc #define pcmcia_tuple_read_4(tuple, idx4) \
    124  1.1.2.1  marc 	(pcmcia_tuple_read_1((tuple), (idx4)) | \
    125  1.1.2.1  marc 	 (pcmcia_tuple_read_1((tuple), (idx4)+1)<<8) | \
    126  1.1.2.1  marc 	 (pcmcia_tuple_read_1((tuple), (idx4)+2)<<16) | \
    127  1.1.2.1  marc 	 (pcmcia_tuple_read_1((tuple), (idx4)+3)<<24))
    128  1.1.2.1  marc #define pcmcia_tuple_read_n(tuple, n, idxn) \
    129  1.1.2.1  marc 	(((n)==1)?pcmcia_tuple_read_1((tuple), (idxn)): \
    130  1.1.2.1  marc 	 (((n)==2)?pcmcia_tuple_read_2((tuple), (idxn)): \
    131  1.1.2.1  marc 	  (((n)==3)?pcmcia_tuple_read_3((tuple), (idxn)): \
    132  1.1.2.1  marc 	   /* n == 4 */ pcmcia_tuple_read_4((tuple), (idxn)))))
    133  1.1.2.1  marc 
    134  1.1.2.1  marc #define PCMCIA_SPACE_MEMORY	1
    135  1.1.2.1  marc #define PCMCIA_SPACE_IO		2
    136  1.1.2.1  marc 
    137  1.1.2.1  marc int pcmcia_ccr_read __P((struct pcmcia_function *, int));
    138  1.1.2.1  marc void pcmcia_ccr_write __P((struct pcmcia_function *, int, int));
    139  1.1.2.1  marc 
    140  1.1.2.1  marc #define pcmcia_mfc(sc) ((sc)->card.pf_head.sqh_first && \
    141  1.1.2.1  marc 			(sc)->card.pf_head.sqh_first->pf_list.sqe_next)
    142  1.1.2.1  marc 
    143  1.1.2.1  marc int pcmcia_enable_function __P((struct pcmcia_function *,
    144  1.1.2.1  marc 				struct device *,
    145  1.1.2.1  marc 				struct pcmcia_config_entry *));
    146  1.1.2.1  marc 
    147  1.1.2.1  marc #define pcmcia_io_alloc(pf, start, size, iotp, iohp) \
    148  1.1.2.1  marc 	(pcmcia_chip_io_alloc((pf)->sc->pct, pf->sc->pch, \
    149  1.1.2.1  marc 			      (start), (size), (iotp), (iohp)))
    150  1.1.2.1  marc 
    151  1.1.2.1  marc int pcmcia_io_map __P((struct pcmcia_function *, int, bus_size_t,
    152  1.1.2.1  marc 		       bus_space_tag_t, bus_space_handle_t, int *));
    153  1.1.2.1  marc 
    154  1.1.2.1  marc #define pcmcia_mem_alloc(pf, size, memtp, memhp, mhandle, realsize) \
    155  1.1.2.1  marc 	(pcmcia_chip_mem_alloc((pf)->sc->pct, (pf)->sc->pch, \
    156  1.1.2.1  marc 			       (size), (memtp), (memhp), (mhandle), \
    157  1.1.2.1  marc 			       (realsize)))
    158  1.1.2.1  marc #define pcmcia_mem_free(pf, size, memt, memh, mhandle) \
    159  1.1.2.1  marc 	(pcmcia_chip_mem_free((pf)->sc->pct, (pf)->sc->pch, \
    160  1.1.2.1  marc 			      (size), (memt), (memh), (mhandle)))
    161  1.1.2.1  marc #define pcmcia_mem_map(pf, kind, size, memt, memh, \
    162  1.1.2.1  marc 			    card_addr, offsetp, windowp) \
    163  1.1.2.1  marc 	(pcmcia_chip_mem_map((pf)->sc->pct, (pf)->sc->pch, \
    164  1.1.2.1  marc 			     (kind), (size), (memt), (memh), \
    165  1.1.2.1  marc 			     (card_addr), (offsetp), (windowp)))
    166  1.1.2.1  marc #define pcmcia_mem_unmap(pf, window) \
    167  1.1.2.1  marc 	(pcmcia_chip_mem_unmap((pf)->sc->pct, (pf)->sc->pch, (window)))
    168  1.1.2.1  marc 
    169  1.1.2.1  marc void *pcmcia_intr_establish __P((struct pcmcia_function *, int,
    170  1.1.2.1  marc 				 int (*)(void *), void *));
    171  1.1.2.1  marc void pcmcia_intr_disestablish __P((struct pcmcia_function *, void *));
    172  1.1.2.1  marc 
    173