void pci_int_set(unsigned char u8bus, unsigned char u8dev, unsigned char u8fun, unsigned char u8reg, unsigned int u32data) { unsigned int u32addr=0; u32addr = u8reg | (u8fun << 8) | (u8dev << 11) | (u8bus << 16) | 0x80000000; io_int_set(0x0cf8, u32addr); io_int_set(0x0cfc, u32data); }
void pci_byte_set(unsigned char u8bus, unsigned char u8dev, unsigned char u8fun, unsigned char u8reg, unsigned char u8data) { unsigned int u32addr=0,u32data=0; u32addr = u8reg | (u8fun << 8) | (u8dev << 11) | (u8bus << 16) | 0x80000000; io_int_set(0x0cf8, u32addr); u32data = io_int_get((unsigned short int) 0x0cfc); u32data = (u32data&0xffffff00) | u8data; io_int_set(0x0cfc, u32data); }
unsigned int pci_int_get(unsigned char u8bus, unsigned char u8dev, unsigned char u8fun, unsigned char u8reg) { unsigned int u32addr=0,u32data=0; u32addr = u8reg | (u8fun << 8) | (u8dev << 11) | (u8bus << 16) | 0x80000000; io_int_set(0x0cf8, u32addr); u32data = io_int_get((unsigned short int) 0x0cfc); return u32data; }
// ----------------------------------------------------------------------- void cchar_int_report(struct cchar_chan_t *chan) { // if interrupt is reported and not yet served, there's nothing to do, for now pthread_mutex_lock(&chan->int_mutex); if (chan->int_reported != -1) { pthread_mutex_unlock(&chan->int_mutex); return; } pthread_mutex_unlock(&chan->int_mutex); // check if any unit reported interrupt for (int unit_n=0 ; unit_n<CCHAR_MAX_DEVICES ; unit_n++) { pthread_mutex_lock(&chan->int_mutex); if ((chan->int_unit[unit_n] != CCHAR_INT_NONE) && !chan->int_mask) { chan->int_reported = unit_n; pthread_mutex_unlock(&chan->int_mutex); LOG(L_CCHR, "CCHAR (ch:%i) reporting interrupt %i", chan->num, chan->num + 12); io_int_set(chan->num); break; } else { pthread_mutex_unlock(&chan->int_mutex); } } }