source: rtems/c/src/lib/libbsp/i386/pc386/include/bsp.h @ f770fcb

Last change on this file since f770fcb was f770fcb, checked in by Joel Sherrill <joel@…>, on Mar 3, 2016 at 4:36:24 PM

Add shared PCI support and enhance pc386 to support non-legacy PCI configuration space

This patch fundamentally results from enhancements to the pc386 BSP
to support systems which do NOT have the legacy PCI BIOS. The
patch adds support for detecting when legacy PCI BIOS is not
present and then using IO space to access to PCI Configuration Space.
This resulted in dynamically selected between two implementations
of PCI and refactoring out the shared methods.

This patch adds shared implementations of pci_bus_count() and
pci_find_device(). Subsequent patches will remove implementations
of these methods in other BSPs where possible.

  • Property mode set to 100644
File size: 10.0 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup i386_pc386
5 *
6 * @brief Global BSP definitions.
7 */
8
9/*-------------------------------------------------------------------------+
10| bsp.h v1.1 - PC386 BSP - 1997/08/07
11+--------------------------------------------------------------------------+
12| This include file contains definitions related to the PC386 BSP.
13+--------------------------------------------------------------------------+
14| (C) Copyright 1997 -
15| - NavIST Group - Real-Time Distributed Systems and Industrial Automation
16|
17| http://pandora.ist.utl.pt
18|
19| Instituto Superior Tecnico * Lisboa * PORTUGAL
20+--------------------------------------------------------------------------+
21| Modified by Eric Valette the 20/05/98 in order to add definitions used
22| to enhance video putchar capabilities.
23|
24| Copyright (C) 1998  valette@crf.canon.fr
25|
26| Canon Centre Recherche France.
27|
28+--------------------------------------------------------------------------+
29| Disclaimer:
30|
31| This file is provided "AS IS" without warranty of any kind, either
32| expressed or implied.
33+--------------------------------------------------------------------------+
34| This code is based on:
35|   bsp.h,v 1.5 1995/12/19 20:07:30 joel Exp - go32 BSP
36| With the following copyright notice:
37| **************************************************************************
38| *  COPYRIGHT (c) 1989-1999.
39| *  On-Line Applications Research Corporation (OAR).
40| *
41| *  The license and distribution terms for this file may be
42| *  found in the file LICENSE in this distribution or at
43| *  http://www.rtems.org/license/LICENSE.
44| **************************************************************************
45+--------------------------------------------------------------------------*/
46
47#ifndef LIBBSP_I386_PC386_BSP_H
48#define LIBBSP_I386_PC386_BSP_H
49
50#ifndef ASM
51
52#include <bspopts.h>
53#include <bsp/default-initial-extension.h>
54#include <bsp/tblsizes.h>
55
56#include <rtems.h>
57#include <rtems/iosupp.h>
58#include <rtems/console.h>
59#include <rtems/clockdrv.h>
60#include <rtems/score/cpu.h>
61#include <rtems/bspIo.h>
62#include <rtems/pci.h>
63
64#ifdef __cplusplus
65extern "C" {
66#endif
67
68/**
69 * @degroup pc386_i386 PC386 Support
70 *
71 * @ingroup bsp_i386
72 *
73 * @brief PC386 support.
74 */
75
76#define BSP_HAS_FRAME_BUFFER 1
77
78/*
79 * Network driver configuration
80 */
81struct rtems_bsdnet_ifconfig;
82
83/* app. may provide a routine (called _very_ early) to tell us
84 * which ports to use for printk / console. BSP provides a default
85 * implementation (weak alias) which does nothing (use BSP default
86 * ports).
87 */
88extern void
89BSP_runtime_console_select(int *pPrintkPort, int *pConsolePort);
90
91extern int rtems_ne_driver_attach(struct rtems_bsdnet_ifconfig *, int);
92#define BSP_NE2000_NETWORK_DRIVER_NAME      "ne1"
93#define BSP_NE2000_NETWORK_DRIVER_ATTACH    rtems_ne_driver_attach
94
95extern int rtems_wd_driver_attach(struct rtems_bsdnet_ifconfig *, int);
96#define BSP_WD8003_NETWORK_DRIVER_NAME      "wd1"
97#define BSP_WD8003_NETWORK_DRIVER_ATTACH    rtems_wd_driver_attach
98
99extern int rtems_dec21140_driver_attach(struct rtems_bsdnet_ifconfig *, int);
100#define BSP_DEC21140_NETWORK_DRIVER_NAME    "dc1"
101#define BSP_DEC21140_NETWORK_DRIVER_ATTACH  rtems_dec21140_driver_attach
102
103extern int rtems_3c509_driver_attach(struct rtems_bsdnet_ifconfig *config);
104#define BSP_3C509_NETWORK_DRIVER_NAME    "3c1"
105#define BSP_3C509_NETWORK_DRIVER_ATTACH  rtems_3c509_driver_attach
106
107#ifndef RTEMS_BSP_NETWORK_DRIVER_NAME
108#define RTEMS_BSP_NETWORK_DRIVER_NAME   BSP_DEC21140_NETWORK_DRIVER_NAME
109#endif
110
111#ifndef RTEMS_BSP_NETWORK_DRIVER_ATTACH
112#define RTEMS_BSP_NETWORK_DRIVER_ATTACH BSP_DEC21140_NETWORK_DRIVER_ATTACH
113#endif
114
115/*-------------------------------------------------------------------------+
116| Constants
117+--------------------------------------------------------------------------*/
118
119/*-------------------------------------------------------------------------+
120| Constants relating to the 8254 (or 8253) programmable interval timers.
121+--------------------------------------------------------------------------*/
122#define IO_TIMER1      0x40
123                  /* Port address of the control port and timer channels */
124#define TIMER_CNTR0    (IO_TIMER1 + 0) /* timer 0 counter port           */
125#define TIMER_CNTR1    (IO_TIMER1 + 1) /* timer 1 counter port           */
126#define TIMER_CNTR2    (IO_TIMER1 + 2) /* timer 2 counter port           */
127#define TIMER_MODE     (IO_TIMER1 + 3) /* timer mode port                */
128#define TIMER_SEL0     0x00            /* select counter 0               */
129#define TIMER_SEL1     0x40            /* select counter 1               */
130#define TIMER_SEL2     0x80            /* select counter 2               */
131#define TIMER_INTTC    0x00            /* mode 0, intr on terminal cnt   */
132#define TIMER_ONESHOT  0x02            /* mode 1, one shot               */
133#define TIMER_RATEGEN  0x04            /* mode 2, rate generator         */
134#define TIMER_SQWAVE   0x06            /* mode 3, square wave            */
135#define TIMER_SWSTROBE 0x08            /* mode 4, s/w triggered strobe   */
136#define TIMER_HWSTROBE 0x0a            /* mode 5, h/w triggered strobe   */
137#define TIMER_LATCH    0x00            /* latch counter for reading      */
138#define TIMER_LSB      0x10            /* r/w counter LSB                */
139#define TIMER_MSB      0x20            /* r/w counter MSB                */
140#define TIMER_16BIT    0x30            /* r/w counter 16 bits, LSB first */
141#define TIMER_BCD      0x01            /* count in BCD                   */
142#define TIMER_RD_BACK  0xc0            /* Read Back Command              */
143                /* READ BACK command layout in the Command Register      */
144#define RB_NOT_COUNT    0x40           /* Don't select counter latch     */
145#define RB_NOT_STATUS   0x20           /* Don't select status latch      */
146#define RB_COUNT_0      0x02           /* Counter 0 latch                */
147#define RB_COUNT_1      0x04           /* Counter 1 latch                */
148#define RB_COUNT_2      0x08           /* Counter 2 latch                */
149#define RB_OUTPUT       0x80           /* Output of the counter is 1     */
150
151#define TIMER_TICK     1193182  /* The internal tick rate in ticks per second */
152
153/*-------------------------------------------------------------------------+
154| Console Defines
155|      WARNING: These Values MUST match the order in
156|               Console_Configuration_Ports
157+--------------------------------------------------------------------------*/
158#define    BSP_CONSOLE_VGA            0
159#define    BSP_CONSOLE_COM1           1
160#define    BSP_CONSOLE_COM2           2
161
162/*-------------------------------------------------------------------------+
163| Convert microseconds to ticks and ticks to microseconds.
164+--------------------------------------------------------------------------*/
165#define US_TO_TICK(us) (((us)*105+44)/88)
166#define TICK_TO_US(tk) (((tk)*88+52)/105)
167
168/*-------------------------------------------------------------------------+
169| External Variables.
170+--------------------------------------------------------------------------*/
171extern interrupt_gate_descriptor Interrupt_descriptor_table[IDT_SIZE];
172extern segment_descriptors _Global_descriptor_table   [GDT_SIZE];
173
174/*-------------------------------------------------------------------------+
175| Function Prototypes.
176+--------------------------------------------------------------------------*/
177void          _IBMPC_initVideo(void);    /* from 'outch.c'  */
178void          _IBMPC_outch    (char);    /* from 'outch.c'  */
179char          _IBMPC_inch     (void);    /* from 'inch.c'   */
180char          _IBMPC_inch_sleep (void);  /* from 'inch.c'   */
181int           BSP_wait_polled_input(void); /* from 'inch.c' */
182int           rtems_kbpoll( void );      /* from 'inch.c' */
183int           getch( void );             /* from 'inch.c' */
184void           add_to_queue( unsigned short b ); /* from 'inch.c' */
185
186void Wait_X_ms(unsigned int timeToWait); /* from 'timer.c'  */
187void Calibrate_loop_1ms(void);           /* from 'timer.c'  */
188
189void rtems_irq_mngt_init(void);          /* from 'irq_init.c' */
190
191#if (BSP_IS_EDISON == 0)
192  void Clock_driver_install_handler(void);             /* from 'ckinit.c'  */
193  void Clock_driver_support_initialize_hardware(void); /* from 'ckinit.c'  */
194#else
195  /**
196   *  @defgroup edison_bsp Clock Tick Support
197   *
198   *  @ingroup i386_pc386
199   *
200   *  @brief Clock Tick Support Package
201   */
202   void *clock_driver_sim_idle_body(uintptr_t);
203   #define BSP_IDLE_TASK_BODY clock_driver_sim_idle_body
204  /* 
205   * hack to kill some time. Hopefully hitting a hardware register is slower
206   * than an empty loop.
207   */
208  #define BSP_CLOCK_DRIVER_DELAY() \
209    do { \
210      uint64_t _i = 2500000; \
211      while (_i) { \
212        _i--; \
213      } \
214    } while ( 0 )
215#endif /* edison */
216
217void *bsp_idle_thread( uintptr_t ignored );
218#define BSP_IDLE_TASK_BODY bsp_idle_thread
219
220void kbd_reset_setup(char *str, int *ints);   /* from 'pc_keyb.c' */
221size_t read_aux(char * buffer, size_t count); /* from 'ps2_mouse.c'  */
222
223bool bsp_get_serial_mouse_device(             /* from 'serial_mouse.c' */
224  const char **name,
225  const char **type
226);
227
228void register_leds(                           /* from 'keyboard.c' */
229  int console,
230  unsigned int led,
231  unsigned int *addr,
232  unsigned int mask
233);
234
235/* Definitions for BSPConsolePort */
236#define BSP_CONSOLE_PORT_CONSOLE (-1)
237#define BSP_CONSOLE_PORT_COM1    (BSP_UART_COM1)
238#define BSP_CONSOLE_PORT_COM2    (BSP_UART_COM2)
239
240/*
241 * Command line.
242 */
243const char* bsp_cmdline(void);
244const char* bsp_cmdline_arg(const char* arg);
245
246#if BSP_ENABLE_IDE
247/*
248 * IDE command line parsing.
249 */
250void bsp_ide_cmdline_init(void);
251
252/*
253 * indicate, that BSP has IDE driver
254 */
255#define RTEMS_BSP_HAS_IDE_DRIVER
256#endif
257
258/* GDB stub stuff */
259void init_remote_gdb( void );
260void i386_stub_glue_init(int uart);
261void i386_stub_glue_init_breakin(void);
262void breakpoint(void);
263
264#define BSP_MAXIMUM_DEVICES 6
265
266/*
267 * Debug helper methods
268 */
269typedef __FILE FILE;
270uint32_t BSP_irq_count_dump(FILE *f);
271
272/*
273 * Prototypes just called from .S files. This lets the .S file include
274 * bsp.h just to establish the dependency.
275 */
276void raw_idt_notify(void);
277void C_dispatch_isr(int vector);
278
279/*
280 * PCI Support Methods
281 */
282const pci_config_access_functions *pci_bios_initialize(void);
283const pci_config_access_functions *pci_io_initialize(void);
284
285#ifdef __cplusplus
286}
287#endif
288
289#endif /* !ASM */
290
291#endif /* _BSP_H */
Note: See TracBrowser for help on using the repository browser.