1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2023 Loongson Technology Corporation Limited
4  */
5 
6 #include <linux/pci.h>
7 
8 #include "lsdc_drv.h"
9 
10 static const struct lsdc_kms_funcs ls7a1000_kms_funcs = {
11 	.create_i2c = lsdc_create_i2c_chan,
12 	.irq_handler = ls7a1000_dc_irq_handler,
13 	.output_init = ls7a1000_output_init,
14 	.cursor_plane_init = ls7a1000_cursor_plane_init,
15 	.primary_plane_init = lsdc_primary_plane_init,
16 	.crtc_init = ls7a1000_crtc_init,
17 };
18 
19 static const struct lsdc_kms_funcs ls7a2000_kms_funcs = {
20 	.create_i2c = lsdc_create_i2c_chan,
21 	.irq_handler = ls7a2000_dc_irq_handler,
22 	.output_init = ls7a2000_output_init,
23 	.cursor_plane_init = ls7a2000_cursor_plane_init,
24 	.primary_plane_init = lsdc_primary_plane_init,
25 	.crtc_init = ls7a2000_crtc_init,
26 };
27 
28 static const struct loongson_gfx_desc ls7a1000_gfx = {
29 	.dc = {
30 		.num_of_crtc = 2,
31 		.max_pixel_clk = 200000,
32 		.max_width = 2048,
33 		.max_height = 2048,
34 		.num_of_hw_cursor = 1,
35 		.hw_cursor_w = 32,
36 		.hw_cursor_h = 32,
37 		.pitch_align = 256,
38 		.has_vblank_counter = false,
39 		.funcs = &ls7a1000_kms_funcs,
40 	},
41 	.conf_reg_base = LS7A1000_CONF_REG_BASE,
42 	.gfxpll = {
43 		.reg_offset = LS7A1000_PLL_GFX_REG,
44 		.reg_size = 8,
45 	},
46 	.pixpll = {
47 		[0] = {
48 			.reg_offset = LS7A1000_PIXPLL0_REG,
49 			.reg_size = 8,
50 		},
51 		[1] = {
52 			.reg_offset = LS7A1000_PIXPLL1_REG,
53 			.reg_size = 8,
54 		},
55 	},
56 	.chip_id = CHIP_LS7A1000,
57 	.model = "LS7A1000 bridge chipset",
58 };
59 
60 static const struct loongson_gfx_desc ls7a2000_gfx = {
61 	.dc = {
62 		.num_of_crtc = 2,
63 		.max_pixel_clk = 350000,
64 		.max_width = 4096,
65 		.max_height = 4096,
66 		.num_of_hw_cursor = 2,
67 		.hw_cursor_w = 64,
68 		.hw_cursor_h = 64,
69 		.pitch_align = 64,
70 		.has_vblank_counter = true,
71 		.funcs = &ls7a2000_kms_funcs,
72 	},
73 	.conf_reg_base = LS7A2000_CONF_REG_BASE,
74 	.gfxpll = {
75 		.reg_offset = LS7A2000_PLL_GFX_REG,
76 		.reg_size = 8,
77 	},
78 	.pixpll = {
79 		[0] = {
80 			.reg_offset = LS7A2000_PIXPLL0_REG,
81 			.reg_size = 8,
82 		},
83 		[1] = {
84 			.reg_offset = LS7A2000_PIXPLL1_REG,
85 			.reg_size = 8,
86 		},
87 	},
88 	.chip_id = CHIP_LS7A2000,
89 	.model = "LS7A2000 bridge chipset",
90 };
91 
92 static const struct lsdc_desc *__chip_id_desc_table[] = {
93 	[CHIP_LS7A1000] = &ls7a1000_gfx.dc,
94 	[CHIP_LS7A2000] = &ls7a2000_gfx.dc,
95 	[CHIP_LS_LAST] = NULL,
96 };
97 
98 const struct lsdc_desc *
lsdc_device_probe(struct pci_dev * pdev,enum loongson_chip_id chip_id)99 lsdc_device_probe(struct pci_dev *pdev, enum loongson_chip_id chip_id)
100 {
101 	return __chip_id_desc_table[chip_id];
102 }
103