Skip to content

Commit

Permalink
7834 uts: vgatext should use gfx_private
Browse files Browse the repository at this point in the history
Reviewed by: Yuri Pankov <yuripv@gmx.com>
Reviewed by: John Howard <Echosoft.LLC@gmail.com>
Reviewed by: Alexander Eremin <a.eremin@nexenta.com>
Approved by: Joshua M. Clulow <josh@sysmgr.org>
  • Loading branch information
tsoome authored and jclulow committed Jan 18, 2019
1 parent 066570e commit 30165b7
Show file tree
Hide file tree
Showing 12 changed files with 370 additions and 1,345 deletions.
2 changes: 1 addition & 1 deletion usr/src/uts/common/io/drm/drm_irq.c
Expand Up @@ -192,7 +192,7 @@ drm_install_irq_handle(drm_device_t *dev)
dev_info_t *dip = dev->dip;

if (dip == NULL) {
DRM_ERROR("drm_install_irq_handle: cannot get vgatext's dip");
DRM_ERROR("drm_install_irq_handle: cannot get gfxp_fb's dip");
return (DDI_FAILURE);
}

Expand Down
18 changes: 9 additions & 9 deletions usr/src/uts/common/io/drm/drm_sunmod.c
Expand Up @@ -140,7 +140,7 @@ drm_supp_register(dev_info_t *dip, drm_device_t *dp)
agp_master_softc_t *agpm;
drm_inst_state_t *mstate;
drm_inst_list_t *entry;
gfxp_vgatext_softc_ptr_t gfxp;
gfxp_fb_softc_ptr_t gfxp;
struct dev_ops *devop;

ASSERT(dip != NULL);
Expand All @@ -161,8 +161,8 @@ drm_supp_register(dev_info_t *dip, drm_device_t *dp)
}

/* Generic graphics initialization */
gfxp = gfxp_vgatext_softc_alloc();
error = gfxp_vgatext_attach(dip, DDI_ATTACH, gfxp);
gfxp = gfxp_fb_softc_alloc();
error = gfxp_fb_attach(dip, DDI_ATTACH, gfxp);
if (error != DDI_SUCCESS) {
DRM_ERROR("drm_supp_regiter: failed to init gfx");
goto exit1;
Expand Down Expand Up @@ -224,9 +224,9 @@ drm_supp_register(dev_info_t *dip, drm_device_t *dp)
exit3:
pci_config_teardown(&pci_cfg_handle);
exit2:
(void) gfxp_vgatext_detach(dip, DDI_DETACH, gfxp);
(void) gfxp_fb_detach(dip, DDI_DETACH, gfxp);
exit1:
gfxp_vgatext_softc_free(gfxp);
gfxp_fb_softc_free(gfxp);
drm_supp_free_drv_entry(dip);
ddi_remove_minor_node(dip, NULL);

Expand Down Expand Up @@ -254,9 +254,9 @@ drm_supp_unregister(void *handle)

/* graphics misc module detach */
if (mstate->mis_gfxp) {
(void) gfxp_vgatext_detach(mstate->mis_dip, DDI_DETACH,
(void) gfxp_fb_detach(mstate->mis_dip, DDI_DETACH,
mstate->mis_gfxp);
gfxp_vgatext_softc_free(mstate->mis_gfxp);
gfxp_fb_softc_free(mstate->mis_gfxp);
}

mstate->mis_devp = NULL;
Expand Down Expand Up @@ -448,7 +448,7 @@ drm_sun_ioctl(dev_t dev, int cmd, intptr_t arg, int mode,
ASSERT(minor <= MAX_CLONE_MINOR);
switch (minor) {
case GFX_MINOR:
retval = gfxp_vgatext_ioctl(dev, cmd, arg,
retval = gfxp_fb_ioctl(dev, cmd, arg,
mode, credp, rvalp, mstate->mis_gfxp);
return (retval);

Expand Down Expand Up @@ -544,7 +544,7 @@ drm_sun_devmap(dev_t dev, devmap_cookie_t dhp, offset_t offset,
minor = DEV2MINOR(dev);
switch (minor) {
case GFX_MINOR:
ret = gfxp_vgatext_devmap(dev, dhp, offset, len, maplen, model,
ret = gfxp_fb_devmap(dev, dhp, offset, len, maplen, model,
mstate->mis_gfxp);
return (ret);

Expand Down
2 changes: 1 addition & 1 deletion usr/src/uts/common/io/drm/drm_sunmod.h
Expand Up @@ -130,7 +130,7 @@ typedef struct drm_instance_state {
drm_device_t *mis_devp;
ddi_acc_handle_t mis_cfg_hdl;
agp_master_softc_t *mis_agpm; /* agpmaster softstate ptr */
gfxp_vgatext_softc_ptr_t mis_gfxp; /* gfx softstate */
gfxp_fb_softc_ptr_t mis_gfxp; /* gfx softstate */
} drm_inst_state_t;


Expand Down
48 changes: 22 additions & 26 deletions usr/src/uts/common/sys/gfx_private.h
Expand Up @@ -37,12 +37,21 @@
extern "C" {
#endif


/*
* Updated "glue" for newer libdrm code.
* See: kernel/drm/src/drm_fb_helper.c
*/

typedef char *gfxp_fb_softc_ptr_t;

/* Memory cache attributes */
#define GFXP_MEMORY_CACHED 0
#define GFXP_MEMORY_UNCACHED 1
#define GFXP_MEMORY_WRITECOMBINED 2

typedef uint64_t gfx_maddr_t;
typedef char *gfxp_acc_handle_t;

extern int gfxp_ddi_segmap_setup(dev_t dev, off_t offset, struct as *as,
caddr_t *addrp, off_t len, uint_t prot, uint_t maxprot, uint_t flags,
Expand All @@ -57,8 +66,6 @@ extern int gfxp_devmap_umem_setup(devmap_cookie_t dhc, dev_info_t *dip,
extern void gfxp_map_devmem(devmap_cookie_t dhc, gfx_maddr_t maddr,
size_t length, ddi_device_acc_attr_t *attrp);


typedef char *gfxp_acc_handle_t;
extern gfxp_acc_handle_t gfxp_pci_init_handle(uint8_t bus, uint8_t slot,
uint8_t function, uint16_t *vendor, uint16_t *device);
extern uint8_t gfxp_pci_read_byte(gfxp_acc_handle_t handle, uint16_t offset);
Expand All @@ -81,35 +88,24 @@ extern void gfxp_fix_mem_cache_attrs(caddr_t kva_start, size_t length,
int cache_attr);
extern gfx_maddr_t gfxp_convert_addr(paddr_t paddr);

typedef char *gfxp_vgatext_softc_ptr_t;

extern gfxp_vgatext_softc_ptr_t gfxp_vgatext_softc_alloc(void);
extern void gfxp_vgatext_softc_free(gfxp_vgatext_softc_ptr_t ptr);
extern int gfxp_vgatext_attach(dev_info_t *devi, ddi_attach_cmd_t cmd,
gfxp_vgatext_softc_ptr_t ptr);
extern int gfxp_vgatext_detach(dev_info_t *devi, ddi_detach_cmd_t cmd,
gfxp_vgatext_softc_ptr_t ptr);
extern int gfxp_vgatext_open(dev_t *devp, int flag, int otyp, cred_t *cred,
gfxp_vgatext_softc_ptr_t ptr);
extern int gfxp_vgatext_close(dev_t devp, int flag, int otyp, cred_t *cred,
gfxp_vgatext_softc_ptr_t ptr);
extern int gfxp_vgatext_ioctl(dev_t dev, int cmd, intptr_t data, int mode,
cred_t *cred, int *rval, gfxp_vgatext_softc_ptr_t ptr);
extern gfxp_fb_softc_ptr_t gfxp_fb_softc_alloc(void);
extern void gfxp_fb_softc_free(gfxp_fb_softc_ptr_t ptr);
extern int gfxp_fb_attach(dev_info_t *devi, ddi_attach_cmd_t cmd,
gfxp_fb_softc_ptr_t ptr);
extern int gfxp_fb_detach(dev_info_t *devi, ddi_detach_cmd_t cmd,
gfxp_fb_softc_ptr_t ptr);
extern int gfxp_fb_open(dev_t *devp, int flag, int otyp, cred_t *cred,
gfxp_fb_softc_ptr_t ptr);
extern int gfxp_fb_close(dev_t devp, int flag, int otyp, cred_t *cred,
gfxp_fb_softc_ptr_t ptr);
extern int gfxp_fb_ioctl(dev_t dev, int cmd, intptr_t data, int mode,
cred_t *cred, int *rval, gfxp_fb_softc_ptr_t ptr);

extern int gfxp_mlock_user_memory(caddr_t address, size_t length);
extern int gfxp_munlock_user_memory(caddr_t address, size_t length);
extern int gfxp_vgatext_devmap(dev_t dev, devmap_cookie_t dhp, offset_t off,
extern int gfxp_fb_devmap(dev_t dev, devmap_cookie_t dhp, offset_t off,
size_t len, size_t *maplen, uint_t model, void *ptr);


/*
* Updated "glue" for newer libdrm code.
* See: kernel/drm/src/drm_fb_helper.c
*/

/* Same as: gfxp_vgatext_softc_ptr_t; */
typedef char *gfxp_fb_softc_ptr_t;

/*
* Used by drm_register_fbops().
* Note: only setmode is supplied.
Expand Down
3 changes: 2 additions & 1 deletion usr/src/uts/i86pc/Makefile.files
Expand Up @@ -188,7 +188,8 @@ DBOOT_OBJS += \
# driver and misc modules
#
GFX_PRIVATE_OBJS += gfx_private.o gfxp_pci.o gfxp_segmap.o \
gfxp_devmap.o gfxp_vgatext.o gfxp_vm.o vgasubr.o
gfxp_devmap.o gfxp_vgatext.o gfxp_vm.o vgasubr.o \
gfxp_fb.o
FIPE_OBJS += fipe_drv.o fipe_pm.o
IOAT_OBJS += ioat.o ioat_rs.o ioat_ioctl.o ioat_chan.o
ISANEXUS_OBJS += isa.o dma_engine.o i8237A.o
Expand Down
97 changes: 97 additions & 0 deletions usr/src/uts/i86pc/io/gfx_private/gfxp_fb.c
@@ -0,0 +1,97 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/

/*
* Copyright 2016 Toomas Soome <tsoome@me.com>
*/

/*
* Generic framebuffer interface. Implementing common interfaces
* for bitmapped frame buffer and vgatext.
*/
#include <sys/types.h>
#include <sys/ddi.h>
#include <sys/sunddi.h>
#include <sys/visual_io.h>
#include <sys/vgareg.h>
#include <sys/vgasubr.h>

#include <sys/gfx_private.h>
#include "gfxp_fb.h"

/* need to keep vgatext symbols for compatibility */
#pragma weak gfxp_vgatext_softc_alloc = gfxp_fb_softc_alloc
#pragma weak gfxp_vgatext_softc_free = gfxp_fb_softc_free
#pragma weak gfxp_vgatext_attach = gfxp_fb_attach
#pragma weak gfxp_vgatext_detach = gfxp_fb_detach
#pragma weak gfxp_vgatext_open = gfxp_fb_open
#pragma weak gfxp_vgatext_close = gfxp_fb_close
#pragma weak gfxp_vgatext_ioctl = gfxp_fb_ioctl
#pragma weak gfxp_vgatext_devmap = gfxp_fb_devmap

gfxp_fb_softc_ptr_t
gfxp_fb_softc_alloc(void)
{
return (kmem_zalloc(sizeof (struct gfxp_fb_softc), KM_SLEEP));
}

void
gfxp_fb_softc_free(gfxp_fb_softc_ptr_t ptr)
{
kmem_free(ptr, sizeof (struct gfxp_fb_softc));
}

int
gfxp_fb_attach(dev_info_t *devi, ddi_attach_cmd_t cmd, gfxp_fb_softc_ptr_t ptr)
{
return (gfxp_vga_attach(devi, cmd, ptr));
}

int
gfxp_fb_detach(dev_info_t *devi, ddi_detach_cmd_t cmd, gfxp_fb_softc_ptr_t ptr)
{
return (gfxp_vga_detach(devi, cmd, ptr));
}

/*ARGSUSED*/
int
gfxp_fb_open(dev_t *devp, int flag, int otyp, cred_t *cred,
gfxp_fb_softc_ptr_t ptr)
{
struct gfxp_fb_softc *softc = (struct gfxp_fb_softc *)ptr;

if (softc == NULL || otyp == OTYP_BLK)
return (ENXIO);

return (0);
}

/*ARGSUSED*/
int
gfxp_fb_close(dev_t devp, int flag, int otyp, cred_t *cred,
gfxp_fb_softc_ptr_t ptr)
{
return (0);
}

int
gfxp_fb_ioctl(dev_t dev, int cmd, intptr_t data, int mode,
cred_t *cred, int *rval, gfxp_fb_softc_ptr_t ptr)
{
return (gfxp_vga_ioctl(dev, cmd, data, mode, cred, rval, ptr));
}

int
gfxp_fb_devmap(dev_t dev, devmap_cookie_t dhp, offset_t off,
size_t len, size_t *maplen, uint_t model, void *ptr)
{
return (gfxp_vga_devmap(dev, dhp, off, len, maplen, model, ptr));
}
68 changes: 68 additions & 0 deletions usr/src/uts/i86pc/io/gfx_private/gfxp_fb.h
@@ -0,0 +1,68 @@
/*
* This file and its contents are supplied under the terms of the
* Common Development and Distribution License ("CDDL"), version 1.0.
* You may only use this file in accordance with the terms of version
* 1.0 of the CDDL.
*
* A full copy of the text of the CDDL should have accompanied this
* source. A copy of the CDDL is also available via the Internet at
* http://www.illumos.org/license/CDDL.
*/

/*
* Copyright 2016 Toomas Soome <tsoome@me.com>
*/

#ifndef _GFXP_FB_H
#define _GFXP_FB_H

/*
* gfxp_fb interfaces.
*/

#ifdef __cplusplus
extern "C" {
#endif

#define TEXT_ROWS 25
#define TEXT_COLS 80

struct gfxp_fb_softc {
struct vgaregmap regs;
struct vgaregmap fb;
off_t fb_size;
int fb_regno;
dev_info_t *devi;
int mode; /* KD_TEXT or KD_GRAPHICS */
caddr_t text_base; /* hardware text base */
char shadow[TEXT_ROWS*TEXT_COLS*2];
caddr_t current_base; /* hardware or shadow */
struct {
boolean_t visible;
int row;
int col;
} cursor;
struct vis_polledio polledio;
struct {
unsigned char red;
unsigned char green;
unsigned char blue;
} colormap[VGA8_CMAP_ENTRIES];
unsigned char attrib_palette[VGA_ATR_NUM_PLT];
unsigned int flags;
kmutex_t lock;
};

/* function definitions */
int gfxp_vga_attach(dev_info_t *, ddi_attach_cmd_t, gfxp_fb_softc_ptr_t);
int gfxp_vga_detach(dev_info_t *, ddi_detach_cmd_t, gfxp_fb_softc_ptr_t);
int gfxp_vga_ioctl(dev_t, int, intptr_t, int, cred_t *, int *,
gfxp_fb_softc_ptr_t);
int gfxp_vga_devmap(dev_t, devmap_cookie_t, offset_t, size_t, size_t *,
uint_t, void *);

#ifdef __cplusplus
}
#endif

#endif /* _GFXP_FB_H */

0 comments on commit 30165b7

Please sign in to comment.